iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
0
自我挑戰組

[LeetCode with JavaScript] 一起來刷 LeetCode吧 ~~~ (ノ>ω<)ノ系列 第 27

[LeetCode with JavaScript] Day 27: Pascal's Triangle

  • 分享至 

  • xImage
  •  

觀前提醒:

  1. 我預設大家已經先思考並分析過題目,沒啥想法才開始 google 找解題靈感。若無,建議每題先花 1~2 顆番茄鐘的時間來分析題目比較好。可參考番茄鐘工作法
  2. 承上,既然已經有思考過了,那我這邊直接 po 題目 + 解題想法 + code +心得 。若已經在 code 內有足夠的註解了,那我可能解題想法 & 心得的部分就不會寫太多,免得干擾你的思考。
  3. 所有解法都是已經取得系統的 Accepted,但或許不是最優解法,請多包涵。
  4. 若對於解法不太懂,可以嘗試用 Chrome 的 debugger 來試跑看看 (教學文)
  5. 最後,歡迎在下面留言指教~教學相長才會進步歐~/images/emoticon/emoticon41.gif

題目

Given a non-negative integer numRows, generate the first numRows of Pascal's triangle.
gif

In Pascal's triangle, each number is the sum of the two numbers directly above it.

Example:

Input: 5
Output:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

解題想法

這題,我們需要利用維基百科上面,對於這個巴斯卡三角形的性質描述,來下手。

除每行最左側與最右側的數字以外,每個數字等於它的左上方與右上方兩個數字之和。

讓我們來重新整理下帕斯卡三角形(線條表示相加)

1
1 1
 \|
1 2 1
 \|\|
1 3 3 1
 \|\|\|
1 4 6 4 1

經我們重新整理此圖後,再搭配運算思維--抽象化的角度來嘗試找出通用的解釋:
任一列(n)裡面,第 k 個數字等於前一列(第 n-1 列)的第 k 個數字與第 k-1 個數字的和

一旦辨識出好的通則後,我們就可以著手開發演算法囉~

CODE

/**
 * @param {number} numRows
 * @return {number[][]}
 */
var generate = function (numRows) {
  // 處理 edge case
  if (numRows === 0) return [];
  // 初始狀態
  let triangle = [[1]];
  for (let i = 1; i < numRows; i++) {
    let prevRow = triangle[i - 1];
    // 每列最首位,一定為 1
    let currRow = [1];
    for (let j = 1; j < i; j++) {
      // 每列的第 n 個數值,皆為前一列 prevRow[j - 1] + prevRow[j] 之總和。
      let x = Number(prevRow[j - 1]);
      let y = Number(prevRow[j]);
      currRow.push([x + y]);
    }
    // 每列最末位,一定為 1
    currRow.push([1]);
    // 把處理好的 currRow ,push 進我們的 triangle
    triangle.push(currRow);
  }
  return triangle;
};

心得

依照上面的思路,再搭配 CODE 內的註解,希望大家應該對於巴斯卡三角形,能有更多的認識~/images/emoticon/emoticon42.gif


謝謝大家的收看,LeetCode 小學堂我們下次見~/images/emoticon/emoticon29.gif


上一篇
[LeetCode with JavaScript] Day 26: House Robber
下一篇
[LeetCode with JavaScript] Day 28: First Unique Character in a String
系列文
[LeetCode with JavaScript] 一起來刷 LeetCode吧 ~~~ (ノ>ω<)ノ30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言